package cn.antblog.jvm;

/**
 * @author yangjy
 * @version 1.0
 * @description: 方法去测试
 * @date 2022/11/7 11:14
 */
public class MethodArea {

    public static void main(String[] args) {
        //采用new 方式 是将两个对象存到堆中， 形成两个不同的对象地址
       /* String s1 = new String("abc");
        String s2 = new String("abc");*/
        //采用直接赋值的方式 是将字符串放到常量池中， 先判断该字符串是否在该常量池 ，如果没用 创建一个新的 再将引用指向该字符串
//        String str1 = "abc";
//        String str2 = "abc";
//        System.out.println(str1 == str2);
//        System.out.println(str1.equals(str2));


        //不能直接写"abc"，双引号的形式，写了就直接在常量池里面吧abc创好了
        String str1 = new String("ab") + new String("c");
        String str2 = new String("ab") + new String("c");
        //实际上两次调用String类的intern()方法，和上面的效果差不多，也是第一次调用会将堆中字符串复制并放入常量池中，
        // 第二次通过此方法获取字符串时，会查看常量池中是否包含，如果包含那么会直接返回常量池中字符串的地址
//        System.out.println(str1 == str2.intern());
//        System.out.println(str1.equals(str2));

        //Stringtables 面试题
        String s1 = "a";
        String s2 = "b";
        String s3 = "a" + "b";
        String s4 = s1 + s2;
        String s5 = "ab";
        String s6 = s4.intern();
        // 问
        System.out.println(s3 == s4);
        System.out.println(s3 == s5);
        System.out.println(s3 == s6);
        String x2 = new String("c") + new String("d");
        String x1 = "cd";
        String intern = x2.intern();

        // 问，如果调换了【最后两行代码】的位置呢，如果是jdk1.6呢
        System.out.println(x1 == x2);


    }
}
